package com.itheima;

import java.io.*;

/*
IO的分类：
    输入流：从硬盘到内存
    输出流：从内存到硬盘

    操作的数据类型分类：
        字节流：

        字符流：
 */
public class Demo_IO {
    public static void main(String[] args) throws IOException {
        //1、创建字节输出流对象指向文件目的地
        //如果不存在，就会创建、如果存在就会覆盖、、父目录必须存在
        //追加重写，后面加一个true，不会清空数据，继续写入
        /*FileOutputStream fos = null;
        try {
            fos = new FileOutputStream("d12_file_io/a.txt");
            //2、写数据
            fos.write(65);
            fos.write(66);
            fos.write(67);
            fos.write("\r\n".getBytes());//了解就行
            byte[] bytes= {73,' ','a','m',' ','s','u','p','e','r','m','a','n','!','!','!'};
            fos.write(bytes);

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //释放资源,关闭后不能再读写数据
            if(fos!=null) {//流创建成功才关闭
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }*/
        //1、创建字节输入流对象指向读取数据的文件（数据源）
        //如果文件存在，就不会报错
        //文件不存在，就直接报错
        /*FileInputStream fis = new FileInputStream("d12_file_io/a.txt");
        //创建字节输出流对象指向文件目的地
        FileOutputStream fos = new FileOutputStream("F:/a.txt");
        //2、读取单个字节
//        int read = fis.read();read是字节
//        System.out.println((char)read);
        //读取多个字节
        byte[] bytes = new byte[8192];//八个字节
        int len;
        //当读取不到数值时，系统返回-1，所以进行判断
        while ((len=fis.read(bytes))!=-1){//读多个字节
           fos.write(bytes,0,len);//写入多个字节,有效的字节
        }
        //3、关闭
        fis.close();
        fos.close();*/
        //创建了字节缓冲输入流指向数据源，默认创建一个字节数组
        long stat = System.currentTimeMillis();
        BufferedInputStream bis = new BufferedInputStream(
                new FileInputStream("F:\\歌曲\\DAWN\\DAWN - 难生恨.flac"));
        //创建一个字节缓冲输出流指向文件目的地
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream("F:\\DAWN - 难生恨.flac"));
        byte[] bytes = new byte[8192];
        int b;
        while ((b=bis.read(bytes))!=-1){
            bos.write(bytes,0,b);
        }
        bis.close();
        bos.close();
        long end = System.currentTimeMillis();
        System.out.println((end-stat)*1.0/1000);
        //硬盘--------------------<----------------------------------内存----------------------------------->----------------硬盘
        //硬盘--------------------|----------------------------内存的运行速度很快-----------------------------|----------------硬盘
        //硬盘--------------------<------------------------------------------------------------------------->----------------硬盘
        //数据源-->字节流->缓冲流-->read()->缓冲输入流的数组(长度：8192)->缓冲输出流的数组(长度：8192)->write()-->缓冲流->字节流-->目的地
    }
}
